<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

/**
 * @property Doctrine $doctrine Biblioteca ORM
 * Controller para gerenciar projetos
 *
 */
class Projeto extends AdminController {

    /**
     * Metodo para listar os cadastros
     *
     * @param int $offset Registro inicial
     */
    public function index( $page = 0 ) {
        $findBy = array();
        if( isNotBlank( $this->input->post( 'nome' ) ) ) {
            $findBy = array_merge( $findBy, array( 'nome' => $this->input->post('nome')));
        }
        $offset = 0;
        if( $page != 0 ) {
            $offset = ( $page - 1 ) * LIMITE_PAGINACAO_ADMIN;
        }
        /*
        $lista = $this->doctrine->em->getRepository( 'Projetos' )->findBy(
            $findBy, NULL, LIMITE_PAGINACAO_ADMIN, $offset
        );
         */
        $lista = $this->getProjetosAgrupados( $offset, LIMITE_PAGINACAO_ADMIN );

        $total = count( $lista );

        $this->assign( 'lista', $lista );
        $this->assign( 'total', $total );

        $this->display( 'projeto/index' );
    }

    /**
     * Exibe a tela de inserção/alteração
     *
     * @param int 
     */
    public function editar($id = null) {
        if (!empty($id) /* && $_SERVER['REQUEST_METHOD'] == 'GET' */) {
            $obj = $this->doctrine->em->getRepository('Projetos')->find($id);
            // colocamos os dados na variavel $_POST
            $_POST = (array) $obj;

            $this->assign( 'casos_testes', $obj->get_casos() );
            $lista = $this->getUsuarioVinculadosProjeto($id);
            $this->assign('lista', $lista);
            $this->assign('total', count($lista));
        }
        $this->assign( 'suites_testes', $this->doctrine->em->getRepository( 'SuitesTestes' )->findAll() );
        $this->assign('projetos_status', $this->getProjetosStatus());
        $this->display('projeto/editar');
    }

    /**
     * Insere um novo objeto ou altera um existente
     *
     * @param int
     */
    public function salvar($id = null) {
        $dao = new Projetos();
        // se está editando (informou o código)
        if (!empty($id)) {
            // pegamos o registro do banco de dados
            $dao = $this->doctrine->em->getRepository('Projetos')->find($id);
        }
        populateForm($dao, $this->input->post());

        $data_criacao = new \DateTime(dataTodate($this->input->post('data_criacao')));
        $prazo = new \DateTime(dataToDate($this->input->post('prazo')));
        $dao->set_data_criacao($data_criacao);
        $dao->set_prazo($prazo);

        $this->doctrine->em->persist($dao);
        $this->doctrine->em->flush();

        redirect('admin/projeto/index');
    }

    /**
     * Remove um aluno
     *
     * @param int 
     */
    public function remover($id) {
        if (!empty($id)) {
            // removemos o objeto
            $dao = $this->doctrine->em->getRepository('Projetos')->find($id);
            if ($dao != null) {
                $this->doctrine->em->remove($dao);
                $this->doctrine->em->flush();
            }
        }
        redirect('admin/projeto/index');
    }

    /*     * *
     * Retorna os usuários para vincular ao projeto
     */

    public function getUsuarios() {
        $idProjeto = $this->input->post('idProjeto');
        $usuarios = $this->getUsuariosLeftProjeto($idProjeto);
        echo json_encode($usuarios);
    }

    public function vincularUsuarios() {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            $idProjeto = $this->input->post('idProjeto');
            $this->deleteUsuariosProjeto($idProjeto);
            $idsUsuarios = $this->input->post('idsUsuarios');
            if (!empty($idsUsuarios)){
                $usuarios = explode(",", $idsUsuarios);
                foreach ($usuarios as $idUsuario) {
                    $this->insertUsuarioProjeto($idUsuario, $idProjeto);
                }
            }
            $lista = $this->getUsuarioVinculadosProjeto($idProjeto);
            $data = array(
                'lista' => $lista,
                'total' => count($lista)
            );
        }
        echo $this->load->view('admin/projeto/vinculo', $data);
    }
    
    public function projetosuite($idSuite){
        echo json_encode($this->getProjetosSuite($idSuite));        
    }

    /////////////////////////////////////////////////////////////////////

    private function getProjetosStatus() {
        return $this->doctrine->em->getRepository('ProjetosStatus')->findAll();
    }

    private function deleteUsuariosProjeto($idProjeto) {
        $sql = "delete from projetos_usuarios where id_projeto = $idProjeto";
        $this->doctrine->em->getConnection()->prepare($sql)->execute();
    }

    private function getUsuariosLeftProjeto($idProjeto) {
        $sql = "select "
                . "u.id_usuario, p.id_pessoa, p.nome, pu.id_projeto "
                . "from "
                . "pessoas p "
                . "inner join usuarios u "
                . "on p.id_pessoa = u.id_pessoa "
                . "left join projetos_usuarios pu "
                . "on u.id_usuario = pu.id_usuario and pu.id_projeto = $idProjeto order by p.nome";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
        $usuario = $stmt->fetchAll();
        return $usuario;
    }

    private function getUsuarioVinculadosProjeto($idProjeto) {
        $sql = "select "
                . "* "
                . "from "
                . "pessoas p "
                . "inner join usuarios u "
                . "on p.id_pessoa = u.id_pessoa "
                . "inner join projetos_usuarios pu "
                . "on u.id_usuario = pu.id_usuario and pu.id_projeto = $idProjeto order by p.nome";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
        $usuario = $stmt->fetchAll();
        return $usuario;
    }
    
    private function getSuitesProjeto($idProjeto){
        $sql = "select "
               ."* "
                . "from "
                . "suites_testes "
                . "where id_projeto = $idProjeto";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
        $suites = $stmt->fetchAll();
        return $suites;
    }
    
    private function getProjetosSuite($idSuite){
        $sql = "select "
               ."* "
                . "from "
                . "projetos "
                . "where id_suite_teste = $idSuite";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
        $projetos = $stmt->fetchAll();
        return $projetos;
    }
    
    private function getProjetosAgrupados( $offset, $limit ) {
        $sql = "
            SELECT 
                st.id_suite_teste, 
                st.nome, 
                pr.id_projeto, 
                CASE 
                    WHEN pr.nome IS NULL
                    THEN 'Nenhum Projeto'
                    ELSE pr.nome
                END AS nome_projeto, 
                pr.data_criacao,
                pr.prazo
            FROM suites_testes st 
            LEFT JOIN projetos pr ON pr.id_suite_teste = st.id_suite_teste
            ORDER BY st.id_suite_teste, st.nome, pr.id_projeto, pr.nome, pr.prazo
            LIMIT $offset, $limit
        ";
        $stmt = $this->doctrine->em->getConnection()->prepare( $sql );
        $stmt->execute();
        return $stmt->fetchAll();
    }
    
    private function insertUsuarioProjeto($idUsuario, $idProjeto){
        $sql = "insert into projetos_usuarios(id_usuario, id_projeto) values($idUsuario, $idProjeto)";
        $this->doctrine->em->getConnection()->prepare($sql)->execute();
    }
}

/* End of file projeto.php */
/* Location: ./application/controllers/admin/projeto.php */